Node.js 最令人詬病的技術債就是它只支援單執行緒,必須透過各種手段才能達到類似的功能,可參考[這一篇]
(https://itnext.io/multi-threading-and-multi-process-in-node-js-ffa5bb5cde98),但是,程式就變得複雜許多了,今天,看到 Node.js 的頭頭 Adam Polak 宣布新版v12將支援 Multi-Threading,興奮之餘,忍不住跟大家分享一下,原文請參考這裡。
先寫一個測試程式,取名 app.js,如下:
const express = require('express');
const fs = require('fs');
const app = express();
app.get('/', (req, res) => {
res.json({
message: 'Hello world!'
})
});
app.get('/compute', (req, res) => {
let json = {};
for (let i=0;i<100000;i++) {
}
res.json({
message: 'done'
})
});
app.listen(3000);
可以看到第一個頁籤執行完畢後,才會執行第二個頁籤,表示Node.js只支援單執行緒。
v12 將提供的作法如下:
const express = require('express');
const fs = require('fs');
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
if (isMainThread) {
console.log("Spawn http server");
const app = express();
app.get('/hello', (req, res) => {
res.json({
message: 'Hello world!'
})
});
app.get('/compute', (req, res) => {
const worker = new Worker(__filename, {workerData: null});
worker.on('message', (msg) => {
res.json({
message: 'done'
});
})
worker.on('error', console.error);
worker.on('exit', (code) => {
if(code != 0)
console.error(new Error(`Worker stopped with exit code ${code}`))
});
});
app.listen(3000);
} else {
let json = {};
for (let i=0;i<100;i++) {
json = JSON.parse(fs.readFileSync('./big-file.json', 'utf8'));
}
json.data.sort((a, b) => a.index - b.index);
parentPort.postMessage({});
}
主要加了兩行:
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
const worker = new Worker(__filename, {workerData: null});
除了支援多執行緒(Multi-Threading)外,另外還有以下新功能:
看到文章後,興沖沖的準備安裝新版測試一下,一看網站,目前能只能下載 v10,傻眼了,只能相信作者所言,Coming soon...。
話說 v10 開始 HTTP/2 不就已經 stable 了
比起這個
express 5 已經難產了許久
只能用其他方法建 http/2
沒辦法直接用 官方的 http/2 module